package com.qingcheng.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.wxpay.sdk.Config;
import com.github.wxpay.sdk.WXPayRequest;
import com.github.wxpay.sdk.WXPayUtil;
import com.qingcheng.service.order.OrderService;
import com.qingcheng.service.pay.WeixinPayService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.Map;

@Service
public class WeixinPayServiceImpl implements WeixinPayService {

    @Autowired
    private Config config;

    /**
     * 生成微信支付二维码（统一下单）
     * @param orderId 订单号
     * @param money 金额（分）
     * @param notifyUrl 回调地址
     * @return
     */
    @Override
    public Map createNative(String orderId, Integer money, String notifyUrl) {

        try {
            //1.封装请求参数
            Map<String,String> map=new HashMap();
            map.put("appid",config.getAppID());//公众账号ID
            map.put("mch_id",config.getMchID());//商户号
            map.put("nonce_str", WXPayUtil.generateNonceStr());//随机字符串
            map.put("body","青橙");//商品描述
            map.put("out_trade_no",orderId);//订单号
            map.put("total_fee",money+"");//金额
            map.put("spbill_create_ip","127.0.0.1");//终端IP
            map.put("notify_url",notifyUrl);//回调地址
            map.put("trade_type","NATIVE");//交易类型
            String xmlParam  = WXPayUtil.generateSignedXml(map, config.getKey());
            System.out.println("参数："+xmlParam);

            //2.发送请求
            WXPayRequest wxPayRequest=new WXPayRequest(config);
            String xmlResult = wxPayRequest.requestWithCert("/pay/unifiedorder", null, xmlParam, false);
            System.out.println("结果："+xmlResult);

            //3.解析返回结果
            Map<String, String> mapResult = WXPayUtil.xmlToMap(xmlResult);

            Map m=new HashMap();
            m.put("code_url", mapResult.get("code_url"));
            m.put("total_fee",money+"");
            m.put("out_trade_no",orderId);
            return m;

        } catch (Exception e) {
            e.printStackTrace();
            return new HashMap();
        }

    }

    @Autowired
    private OrderService orderService;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public void notifyLogic(String xml) {
        try {
            Map<String, String> map = WXPayUtil.xmlToMap(xml);
            //验证签名是否一致
            boolean signatureValid = WXPayUtil.isSignatureValid(map, config.getKey());

            if (signatureValid) { //签名一致时
                if ("SUCCESS".equals(map.get("result_code"))) {  //是否支付成功
                    //修改订单状态
                    System.out.println("修改订单状态！");
                    orderService.updatePayStatus(map.get("out_trade_no"), map.get("transaction_id"));
                    //发送订单号给Mq
                    rabbitTemplate.convertAndSend("paynotify","",map.get("out_trade_no"));
                } else {
                    //记录日志 ，查看原因
                    System.out.println("支付失败！");
                }
            } else {
                //记录日志 ，查看原因
                System.out.println("签名不一致，非法操作！");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public Map queryPayStatus(String orderId) {
        return null;
    }
}
